﻿/*****************************************************************//**
 * @file   VAOneXMLAdaptorSeaShell.h
 * @brief  VAOne读写SEA板适配器
 * 
 * @author lixiaolong (lixiaolong@diso.cn)
 * @date   2024-11-7
 *********************************************************************/
#ifndef VAONEXMLADAPTORSEASHELL_H
#define VAONEXMLADAPTORSEASHELL_H

#include "FITKVAOneXMLIOAPI.h"
#include "FITKAbstractVAOneXMLAdaptor.h"
#include "FITK_Kernel/FITKCore/FITKCoreMacros.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"
#include "FITKAcousticsModel/FITKAbstractSEASubSys.h"

namespace Acoustics
{
    class FITKAcousticsSEASubSysManager;
    class FITKAbstractSEASubSys;
    class FITKAbstractSEASubSysShell;
}

namespace IO
{
    /**
     * @brief   VAOne读写板适配器
     * @author  lixiaolong (lixiaolong@diso.cn)
     * @data    2024-11-7
     */
    class FITKVAOneXMLIOAPI VAOneXMLAdaptorSeaShell : public FITKAbstractVAOneXMLAdaptor
    {
        FITKCLASS(IO, VAOneXMLAdaptorSeaShell);
    public:

        /**
         * @brief   构造函数
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @data    2024-11-7
         */
        explicit VAOneXMLAdaptorSeaShell()= default;

        /**
         * @brief   析构函数
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @data    2024-11-7
         */
        ~VAOneXMLAdaptorSeaShell() = default;

        /**
         * @brief   适配器读数据
         * @return  是否执行成功
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @date    2024-11-7
         */
        bool adaptR() override;

        /**
         * @brief   适配器写数据
         * @return  是否执行成功
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @date    2024-11-7
         */
        bool adaptW() override;

    protected:

        /**
         * @brief getNodeName 获取xml节点名字
         * @return  xml节点名字 类型无效时需子类自己实现adaptR和adaptW 有效时根据实际数据重新实现读写接口
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @date    2024-11-8
         */
        virtual QString getNodeName() = 0;

        /**
         * @brief getNodeType 获取节点类型
         * @return  节点类型 类型无效时需子类自己实现adaptR和adaptW 有效时根据实际数据重新实现读写接口
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @date    2024-11-8
         */
        virtual Acoustics::FITKAbstractSEASubSys::SEASubSysType getNodeType() = 0;

        /**
         * @brief createDataObjNode 创建数据节点
         * @return 数据节点实例
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @date    2024-11-8
         */
        virtual Acoustics::FITKAbstractSEASubSysShell *createDataObjNode() = 0;

        /**
         * @brief   读取物理属性数据
         * @param[i] node     xml节点数据
         * @param[o] data   板节点数据
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @date    2024-11-8
         */
        virtual void readPhyProperty(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell *data);

        /**
         * @brief   读取损耗因子谱数据
         * @param[i] node     xml节点数据
         * @param[o] data   板节点数据
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @date    2024-11-8
         */
        virtual void readDamping(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell *data);

        /**
         * @brief   读取辐射数据
         * @param[i] node     xml节点数据
         * @param[o] data   板节点数据
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @date    2024-11-8
         */
        virtual void readRadiation(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell *data);

        /**
         * @brief   读取弯曲波数据
         * @param[i] node     xml节点数据
         * @param[o] data   板节点数据
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @date    2024-11-8
         */
        virtual void readFlexureWave(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell *data);

        /**
         * @brief   读取拉伸波数据
         * @param[i] node     xml节点数据
         * @param[o] data   板节点数据
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @date    2024-11-8
         */
        virtual void readExtensionWave(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell *data);

        /**
         * @brief   读取剪切波数据
         * @param[i] node     xml节点数据
         * @param[o] data   板节点数据
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @date    2024-11-8
         */
        virtual void readShearWave(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell *data);

        /**
         * @brief   读取单个单元数据
         * @param[i] node     xml节点数据
         * @param[o] data   板节点数据
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @date    2024-11-8
         */
        virtual void readSingleShell(rapidxml::xml_node<char>* node, Acoustics::FITKAbstractSEASubSysShell *data);

        /**
         * @brief   写物理属性数据
         * @param[i] data   板节点数据
         * @param[o] node   xml节点数据
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @date    2024-11-8
         */
        virtual void writePhyProperty(Acoustics::FITKAbstractSEASubSysShell *data, rapidxml::xml_node<char>* node);

        /**
         * @brief  写损耗因子谱数据
         * @param[i] data   板节点数据
         * @param[o] node   xml节点数据
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @date    2024-11-8
         */
        virtual void writeDamping(Acoustics::FITKAbstractSEASubSysShell *data, rapidxml::xml_node<char>* node);

        /**
         * @brief   写辐射数据
         * @param[i] data   板节点数据
         * @param[o] node   xml节点数据
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @date    2024-11-8
         */
        virtual void writeRadiation(Acoustics::FITKAbstractSEASubSysShell *data, rapidxml::xml_node<char>* node);

        /**
         * @brief   写入波数据
         * @param[i] data   板节点数据
         * @param[o] node   xml节点数据
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @date    2024-11-8
         */
        virtual void writeWave(Acoustics::FITKAbstractSEASubSysShell *data, rapidxml::xml_node<char>* node);

        /**
         * @brief   写入单个单元数据
         * @param[i] data   板节点数据
         * @param[o] node    xml节点数据
         * @author  lixiaolong (lixiaolong@diso.cn)
         * @date    2024-11-8
         */
        virtual void writeSingleShell(Acoustics::FITKAbstractSEASubSysShell *data, rapidxml::xml_node<char>* node);

    private:
    };
}

#endif // VAONEXMLADAPTORSEASHELL_H
